第一次写教程的,python小白,求不喷,求大神指点指点
之前看了很多关于绘制玫瑰图的教程,有基于R的ggplot2的或者用AI的艺术画笔做的,但是似乎很少有用malplotlib来做,最近刚好研究下matplotlib里的极坐标的用法,于是模仿着一些图,尝试了一下画玫瑰图,感觉效果还行。先Po原图和成品
以下是尝试模仿的成品:
emmmm,差不多 差不多就行,哈哈哈 100%还原太麻烦了
文字的和其他的修饰,作者实在嫌麻烦,有兴趣的朋友,可以自己尝试一下
下面进入教学时间,大家鼓掌
1.什么是玫瑰图
玫瑰图,玫瑰图,就是长得像玫瑰一样美丽的图(一耳光,pia扇飞了,不要说废话)
emmm,玫瑰图其实就是被掰弯了的柱状图(o(*////▽////*)q的捂脸)
2.怎么掰弯了个笔直的柱状图
用爱(又是一耳光,能不能正经点这位作者)
emmm, 把在笛卡尔坐标系里的柱状图,画到极坐标系去
3.什么是极坐标
长这样:
传统的笛卡尔坐标是这样的:
笛卡尔坐标系中,靠x,y两个值能确定一个点的位置,而在极坐标中,考的是r(半径),θ(角度)来确定一个点的位置。
知识点:想把柱状图从笛卡尔家搬到极坐标家去,重要的就是算好θ
4.先画一个90度半圆
为了能打好基础,我们先来画个如下半圆。
import numpy as np
import matplotlib.pyplot as plt
y=20
x=np.pi/2
w=np.pi/2
color=(206/255,32/255,69/255)
edgecolor=(206/255,32/255,69/255)
fig=plt.figure(figsize=(13.44,7.5))#建立一个画布
ax = fig.add_subplot(111,projection='polar')#建立一个坐标系,projection='polar'表示极坐标
ax.bar(left=x, height=y, width=w,bottom=10,color=color,edgecolor=color)
fig.savefig('E:\\test.png',dpi=400,bbox_inches='tight',transparent=True)
可以很清楚的发现
在笛卡尔坐标系中,一个柱状图由left,bottom,height,width四个参数决定位置和大小left决定了左边界,bottom决定了下边界,height决定了长度,width决定了宽度.
对应到笛卡尔坐标系中,left决定了扇形的中线位置,然后height决定扇形的长度,bottom决定了下边界,width决定了扇形的宽度。
能在目标位置画上一个扇形,基本上我们就能开始画玫瑰图辣!回到我们的例子中来
这个图由十个大扇形构成底图,然后中间在加上2个小的扇形。
所以先计算,十个大扇形的位置,思路大概是,把一个圆分成十份,然后找到十个扇形中线对应的θ。
x1=[np.pi/10+np.pi*i/5 for i in range(1,11)]
然后在计算20个小扇形的位置
x2=[np.pi/20+np.pi*i/5 for i in range(1,11)]
x3=[3*np.pi/20+np.pi*i/5 for i in range(1,11)]
由于作者很怕麻烦,所以y值就随机生成了
先画第一层,最外圈的放文字的位置。
为了能画出线来,作者用重叠的方式,先画个半径是7000,在画个半径是6000,然后
x1=[np.pi/10+np.pi*i/5 for i in range(1,11)]
x2=[np.pi/20+np.pi*i/5 for i in range(1,11)]
x3=[3*np.pi/20+np.pi*i/5 for i in range(1,11)]
y1=[7000 for i in range(0,10)]
y2=[6000 for i in range(0,10)]
fig=plt.figure(figsize=(13.44,7.5))
ax = fig.add_subplot(111,projection='polar')
ax.axis('off')
ax.bar(left=x1, height=y1,width=np.pi/5,color=(220/255,222/255,221/255),edgecolor=(204/255,206/255,205/255))
ax.bar(left=x1, height=y2,width=np.pi/5,color='w',edgecolor=(204/255,206/255,205/255))
random.seed(100)
y4=[random.randint(4000,5500) for i in range(10)]
y5=[random.randint(3000,5000) for i in range(10)]
ax.bar(left=x2, height=y4,width=np.pi/10,color=(206/255,32/255,69/255),edgecolor=(206/255,32/255,69/255))
ax.bar(left=x3, height=y5,width=np.pi/10,color=(34/255,66/255,123/255),edgecolor=(34/255,66/255,123/255))
然后我们在画中间的
最后在在中间画一个白色的小圆
y6=[2000 for i in range(0,10)]
ax.bar(left=x1, height=y6,width=np.pi/5,color='w',edgecolor='w')
大功告成,撒花
本文已由原作者授权
如需转载请联系EasyCharts团队!
【书籍推荐】《Excel 数据之美--科学图表与商业图表的绘制》
【手册获取】国内首款-数据可视化参考手册:专业绘图必备
【必备插件】 EasyCharts -- Excel图表插件
【网易云课堂】 Excel 商业图表修炼秘笈之基础篇